home *** CD-ROM | disk | FTP | other *** search
/ Group 42-Sells Out! - The Information Archive / Group 42 Sells Out (Group 42) (1996).iso / hack / tv / sat / euro / picblock.asm < prev    next >
Assembly Source File  |  1995-04-25  |  10KB  |  289 lines

  1. TITLE   'PICBLOCK'
  2. LIST P=16C84
  3. LIST F=INHX8M
  4. ;
  5. ;       Decoder data --> PORTB.0
  6. ;       Card data -----> PORTA.0
  7. ;
  8. ORG 0
  9. ; Registers
  10. IND0            EQU     0
  11. TMR0            EQU     1
  12. PC              EQU     2
  13. STATUS          EQU     3
  14. FSR             EQU     4
  15. PORTA           EQU     5
  16. PORTB           EQU     6
  17. TRISB           EQU     6
  18. EEDATA          EQU     8
  19. EEADR           EQU     9
  20. PCLATH          EQU     10
  21. INTCON          EQU     11
  22. ;
  23. VC_data         EQU     12
  24. Byte_count      EQU     13
  25. Bit_count       EQU     14
  26. Cla             EQU     15
  27. Ins             EQU     16
  28. P1              EQU     17
  29. P2              EQU     18
  30. Count           EQU     19
  31. Del             EQU     20
  32. SN1             EQU     21
  33. SN2             EQU     22
  34. ;
  35. ; Macros
  36. SAME            EQU     1                
  37. Z               EQU     2
  38.  
  39.         GOTO    START
  40.  
  41. ;******************************************************************************
  42. ;               Read byte from card or decoder.
  43. ;               Byte is passed on to decoder or card
  44. ;               or card to decoder, bit by bit.
  45. ;                       Exits with byte in reg. data.
  46. ;******************************************************************************
  47. Read_byte 
  48.         BTFSS   PORTB,0         ; Wait for start bit - decoder
  49.         GOTO    To_Card         ; Decoder to card com
  50.         BTFSS   PORTA,0         ; Wait for start bit - card
  51.         GOTO    To_Dec          ; Card to decoder com
  52.         GOTO    Read_byte       ; No start bit found
  53. To_Dec          
  54.         CALL    Half_delay      ; Half-bit delay - center of start bit
  55.         BSF     STATUS,5        ; Change to page 1
  56.         BCF     TRISB,0         ; PB.0 to output - to decoder
  57.         BCF     STATUS,5        ; Back to page 0
  58.         BCF     PORTB,0         ; Send start bit to decoder
  59.         BTFSC   PORTA,0
  60.         GOTO    Stop_cd
  61.         MOVLW   8               ; Get number of data bits
  62.         MOVWF   Bit_count       ; Store it
  63.         CLRF    VC_data         ; Clear data register
  64.         CALL    Bit_delay       ; 1-bit delay - centre of 1st bit
  65.         BCF     STATUS,0        ; Clear carry bit
  66. Nxt_Cbit           
  67.         RLF     VC_data,SAME    ; Shift data bits left 1
  68.         BTFSS   PORTA,0         ; Read card i/o, is it high ?
  69.         GOTO    Cbit_0          ; ...no
  70.         BSF     PORTB,0         ; Card i/o high, so send decoder a 1
  71.         INCF    VC_data,SAME    ; Read a 1, so data LSB to 1
  72.         GOTO    Rd_Cbit         ; Bit = 1
  73. Cbit_0          
  74.         BCF     PORTB,0         ; Read a 0, so send decoder a 0
  75. Rd_Cbit           
  76.         CALL    Bit_delay       ; Wait till centre of next bit
  77.         DECFSZ  Bit_count,SAME  ; All bits read yet ?  
  78.         GOTO    Nxt_Cbit        ; ...no, get next bit
  79.         BTFSS   PORTA,0         ; 8 data bits read, read parity bit
  80.         BCF     PORTB,0         ; Parity = 0, so send decoder a 0
  81.         BTFSC   PORTA,0         ; Read parity bit again
  82.         BSF     PORTB,0         ; Parity = 1, so send decoder a 1
  83.         CALL    Bit_delay       ; Wait till centre of stop bit
  84.         COMF    VC_data,SAME    ; Invert data
  85. Stop_cd
  86.         BSF     PORTB,0         ; Send decoder stop bit
  87.         BSF     STATUS,5        ; Change to page 1
  88.         BSF     TRISB,0         ; PB.0 to input
  89.         BCF     STATUS,5        ; Back to page 0
  90.         CALL    Bit_delay
  91.  
  92.         RETURN
  93.  
  94. ;******************************************************************************
  95. ;               Decoder to card
  96. ;******************************************************************************
  97. To_Card         CALL    Half_delay      ; Half-bit delay - center of start bit
  98.         BSF     STATUS,5        ; Change to page 1          
  99.         BCF     PORTA,0         ; PA.0 to output - to card   
  100.         NOP
  101.         BCF     STATUS,5        ; Back to page 0           
  102.         BCF     PORTA,0         ; Send start bit to card  
  103.         BTFSC   PORTB,0
  104.         GOTO    Stop_dc
  105.         MOVLW   8               ; Get number of data bits  
  106.         MOVWF   Bit_count       ; Store it   
  107.         CLRF    VC_data         ; Clear data register 
  108.         CALL    Bit_delay       ; 1-bit delay - centre of 1st bit   
  109.         BCF     STATUS,0        ; Clear carry bit          
  110. Nxt_Dbit           
  111.         RLF     VC_data,SAME    ; Shift data bits left 1      
  112.         NOP
  113.         BTFSS   PORTB,0         ; Read decoder i/o, is it high ?
  114.         GOTO    Dbit_0          ; ... no         
  115.         BSF     PORTA,0         ; Decoder i/o high, so send card a 1    
  116.         INCF    VC_data,SAME    ; Read a 1, so data LSB to 1  
  117.         GOTO    Rd_Dbit         ; Next bit      
  118. Dbit_0          
  119.         BCF     PORTA,0         ; Read a 0, so send card a 0   
  120. Rd_Dbit         
  121.         CALL    Bit_delay       ; Wait till centre of next bit  
  122.         NOP
  123.         DECFSZ  Bit_count,SAME  ; All bits read yet ? 
  124.         GOTO    Nxt_Dbit        ; .. no, get next bit 
  125.         BTFSS   PORTB,0         ; 8 data bits read, read parity bit  
  126.         BCF     PORTA,0         ; Parity = 0, so send decoder a 0  
  127.         BTFSC   PORTB,0         ; Read parity bit again      
  128.         BSF     PORTA,0         ; Parity = 1, so send card a 1     
  129.         CALL    Bit_delay       ; Wait till centre of stop bit 
  130.         COMF    VC_data,SAME    ; Invert data    
  131. Stop_dc                
  132.         BSF     PORTA,0         ; Send card stop bit   
  133.         BSF     STATUS,5        ; Change to page 1             
  134.         BSF     PORTA,0         ; PA.0 to input   
  135.         BCF     STATUS,5        ; Back to page 0            
  136.         RETURN
  137.  
  138. ;******************************************************************************
  139. ;               Send 00 in place of remaining E0 string
  140. ;******************************************************************************
  141. Send_00         
  142.         BTFSC   PORTB,0         ; Wait for start bit from decoder
  143.         GOTO    Send_00
  144.         CALL    Half_delay      ; Half-bit delay - center of start bit
  145.         BSF     STATUS,5        ; Change to page 1          
  146.         BCF     PORTA,0         ; PA.0 to output - to card   
  147.         BCF     PORTA,1
  148.         BCF     STATUS,5        ; Back to page 0           
  149.         BCF     PORTA,0         ; Send start bit to card  
  150.         
  151.         BTFSC   PORTB,0
  152.         GOTO    Stop_dc0
  153.         
  154.         MOVLW   8               ; Get number of data bits  
  155.         MOVWF   Bit_count       ; Store it   
  156.         NOP 
  157.         CALL    Bit_delay       ; 1-bit delay - centre of 1st bit   
  158.         BCF     STATUS,0        ; Clear carry bit          
  159. NEXT0           NOP                     ; NOPs to preserve bit timing   
  160.         BSF     PORTA,1         ; Scope monitor bit
  161.         NOP      
  162.         NOP         
  163.         BSF     PORTA,0         ; Send card a 0 ( inverse )    
  164.         NOP
  165.         NOP   
  166.         NOP   
  167.         CALL    Bit_delay       ; Wait till centre of next bit  
  168.         BCF     PORTA,1         ; For scope
  169.         DECFSZ  Bit_count,SAME  ; All bits read yet ? 
  170.         GOTO    NEXT0           ; .. no, get next bit 
  171.         NOP
  172.         NOP  
  173.         NOP   
  174.         NOP     
  175.         CALL    Bit_delay       ; Wait till centre of stop bit 
  176.         NOP 
  177. Stop_dc0               
  178.         BSF     PORTA,0         ; Send card stop bit   
  179.         BSF     STATUS,5        ; Change to page 1             
  180.         BSF     PORTA,0         ; PA.0 to input   
  181.         BCF     STATUS,5        ; Back to page 0            
  182.         RETURN
  183.  
  184. ;******************************************************************************
  185. ;               Delay for 48uS or 89uS
  186. ;******************************************************************************
  187. Half_delay           
  188.         MOVLW   0xE
  189.         GOTO    Delay
  190.  
  191. Bit_delay       
  192.         MOVLW   0x1A
  193. Delay           
  194.         MOVWF   Del
  195. Del_loop           
  196.         DECFSZ  Del,SAME
  197.         GOTO    Del_loop
  198.         RETURN
  199. ;*****************************************************************************
  200. ;                                 Start of program 
  201. ;*****************************************************************************
  202. START           CLRF    Cla
  203.         CLRF    Ins
  204.         CLRF    P1
  205.         CLRF    P2
  206.  
  207. ;******************************** Main program loop **************************
  208. MAIN
  209.         MOVF    Ins,W
  210.         MOVWF   Cla
  211.         MOVF    P1,W
  212.         MOVWF   Ins
  213.         MOVF    P2,W
  214.         MOVWF   P1
  215.         CALL    Read_byte
  216.         MOVF    VC_data,W
  217.         MOVWF   P2
  218.         BTFSS   STATUS,Z       ; Check P2 = 0
  219.         GOTO    MAIN
  220.         MOVF    Cla,W
  221.         XORLW   0x53            ; Check for Vcrypt class code
  222.         BTFSS   STATUS,Z
  223.         GOTO    MAIN            ; Loop round until class 53h found
  224.         MOVF    P1,SAME
  225.         BTFSS   STATUS,Z        ; Check for P1 = 0
  226.         GOTO    MAIN            ; Not header - try again
  227.         CALL    Read_byte       ; Read byte count
  228.         MOVF    VC_data,W
  229.         MOVWF   Byte_count      ; Store byte count
  230.         INCF    Byte_count,SAME
  231.         CALL    Read_byte       ; Transfer ins back
  232.         MOVLW   0x74            ; Instruction 74h ?
  233.         XORWF   Ins,W
  234.         BTFSC   STATUS,Z
  235.         GOTO    Ins74
  236.         GOTO    MAIN
  237.  
  238. ;************** Instruction code 74h - message from station *****************
  239. Ins74          
  240.         MOVLW   0x1F
  241.         MOVWF   Count
  242.         CALL    Read_byte       ; Read 1st byte
  243.         BTFSS   VC_data,3       ; Check for E8 or E0 1st byte
  244.         GOTO    block
  245. No_block        
  246.         CALL    Read_byte       ; Read/send remaining 31 bytes
  247.         DECFSZ  Count,SAME
  248.         GOTO    No_block
  249.         GOTO    MAIN
  250. block                
  251.         MOVLW   0xA
  252.         MOVWF   Count
  253. block10
  254.         CALL    Read_byte       ; Read/send 1st 10 bytes
  255.         DECFSZ  Count,SAME
  256.         GOTO    block10
  257.         CALL    Read_byte       ; Get E0 S/N 5th digit (1)
  258.         MOVF    VC_data,W
  259.         MOVWF   SN1
  260.         CALL    Read_byte       ; Get E0 S/N 5th digit (2)
  261.         MOVF    VC_data,W
  262.         MOVWF   SN2
  263.         CALL    Read_byte       ; Get E0 S/N 5th digit (3)
  264.         MOVF    VC_data,W
  265.         XORWF   SN2,SAME
  266.         BTFSS   STATUS,Z        ; Does digit 3 = digit 2 ?
  267.         GOTO    E0_ok
  268.         XORWF   SN1,SAME
  269.         BTFSS   STATUS,Z        ; Does digit 3 = digit 1 ?
  270.         GOTO    E0_ok
  271.                     ; 3 consecutive bytes are the same
  272.         MOVLW   0x12            ; 18 bytes left in E0 string
  273.         MOVWF   Count
  274. Kill_E0
  275.         CALL    Send_00         ; Kill remaining 18 bytes
  276.         DECFSZ  Count
  277.         GOTO    Kill_E0
  278.         GOTO    MAIN
  279. E0_ok
  280.         MOVLW   0x12            ; 18 bytes left in E0 string
  281.         MOVWF   Count
  282. No_kill
  283.         CALL    Read_byte       ; Pass on remaining 18 bytes
  284.         DECFSZ  Count
  285.         GOTO    No_kill
  286.         GOTO    MAIN
  287.  
  288. END
  289.